/**
  ******************************************************************************
  * @file    sym32l010_hal_uart.h
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   Header file of UART HAL module.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SYM32L010_HAL_UART_H
#define __SYM32L010_HAL_UART_H

#ifdef __cplusplus
extern "C" {
#endif


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_def.h"


/******************************************************************************/
/* Global type definitions                                                    */
/******************************************************************************/
/* UART 错误码 ---------------------------------------------------------------*/
typedef enum
{
    UART_ERROR_NONE        =  (0x0UL),                                // 无错误
    UART_ERROR_ORE         =  (0x1UL),                                // 溢出错误
    UART_ERROR_NE          =  (0x2UL),                                // 检测到噪声
    UART_ERROR_PE          =  (0x3UL),                                // 奇偶校验错误
    UART_ERROR_FE          =  (0x4UL),                                // 帧结构错误
    UART_ERROR_TIMEOUT     =  (0x5UL),                                // 超时错误
    UART_ERROR_BUFOV       =  (0x6UL),                                // 接收buff满，但未收到停止条件
} UART_ErrorCodeTypeDef;

/* UART 工作模式 -------------------------------------------------------------*/
typedef enum
{
    UART_WORKMODE_ASYN         = (0x0UL << UARTx_CR1_SYNC_Pos),       // 异步模式
    UART_WORKMODE_SYNC         = (0x1UL << UARTx_CR1_SYNC_Pos)        // 同步模式
} UART_WorkModeTypeDef;

/* 传输时钟 ------------------------------------------------------------------*/
typedef enum
{
    UART_CLKSRC_PCLK           = (0x0UL << UARTx_CR1_SOURCE_Pos),     // 传输时钟为PCLK
    UART_CLKSRC_LSE            = (0x2UL << UARTx_CR1_SOURCE_Pos),     // 传输时钟为LSE
    UART_CLKSRC_LSI            = (0x3UL << UARTx_CR1_SOURCE_Pos)      // 传输时钟为LSI
} UART_ClockSourceTypeDef;

/* 单线功能 ------------------------------------------------------------------*/
typedef enum
{
    UART_SINGLEWIRE_DISABLE    = (0x0UL << UARTx_CR1_SINGLE_Pos),     // 通过TXD发送数据,通过RXD接收数据
    UART_SINGLEWIRE_ENABLE     = (0x1UL << UARTx_CR1_SINGLE_Pos)      // 通过TXD发送和接收数据
} UART_SingleWireEnTypeDef;

/* 校验方式 ------------------------------------------------------------------*/
typedef enum
{
    UART_PARITYMODE_NONE       = (0x0UL << UARTx_CR1_CHLEN_Pos)    |  // 无校验
                                 (0x0UL << UARTx_CR1_PARITYEN_Pos) |
                                 (0x0UL << UARTx_CR1_PARITY_Pos),
    UART_PARITYMODE_EVEN       = (0x1UL << UARTx_CR1_CHLEN_Pos)    |  // 偶校验
                                 (0x1UL << UARTx_CR1_PARITYEN_Pos) |
                                 (0x0UL << UARTx_CR1_PARITY_Pos),
    UART_PARITYMODE_ODD        = (0x1UL << UARTx_CR1_CHLEN_Pos)    |  // 奇校验
                                 (0x1UL << UARTx_CR1_PARITYEN_Pos) |
                                 (0x1UL << UARTx_CR1_PARITY_Pos),
    UART_PARITYMODE_CUSTOM     = (0x1UL << UARTx_CR1_CHLEN_Pos)    |  // 自定义校验 (用于多机通信或9bit数据域传输)
                                 (0x0UL << UARTx_CR1_PARITYEN_Pos) |
                                 (0x0UL << UARTx_CR1_PARITY_Pos)
} UART_ParityModeTypeDef;

/* 数据域长度 ----------------------------------------------------------------*/
typedef enum
{
    UART_DATAWIDTH_8BIT        = 0UL,                                 // 数据帧包含8bit的数据域
    UART_DATAWIDTH_9BIT        = 1UL                                  // 数据帧包含9bit的数据域
                                                                      // 注：传输9bit数据时，请开启自定义校验"UART_PARITYMODE_CUSTOM"，且勿开启多机通信功能
} UART_DataWidthTypeDef;

/* 停止位 --------------------------------------------------------------------*/
typedef enum
{
    UART_STOPBITS_1            = (0x0UL << UARTx_CR1_STOP_Pos),       // STOP = 1
    UART_STOPBITS_1P5          = (0x1UL << UARTx_CR1_STOP_Pos),       // STOP = 1.5
    UART_STOPBITS_2            = (0x2UL << UARTx_CR1_STOP_Pos)        // STOP = 2
} UART_StopBitTypeDef;

/* RXD启动接收方式 -----------------------------------------------------------*/
typedef enum
{
    UART_RXDSTART_FALL         = (0x0UL << UARTx_CR1_START_Pos),      // RXD 下降沿启动接收
    UART_RXDSTART_LOW          = (0x1UL << UARTx_CR1_START_Pos)       // RXD 低电平启动接收
} UART_RxdStartTypeDef;

/* 最高有效位MSB在前使能控制 -------------------------------------------------*/
typedef enum
{
    UART_FIRSTBIT_LSB          = (0x0UL << UARTx_CR1_MSBF_Pos),       // 最低有效位LSB收发在前
    UART_FIRSTBIT_MSB          = (0x1UL << UARTx_CR1_MSBF_Pos)        // 最高有效位MSB收发在前
}UART_FirstBitTypeDef;

/* 硬件流控 ------------------------------------------------------------------*/
typedef enum
{
    UART_HWCONTROL_NONE        = (0x0UL << UARTx_CR2_CTSEN_Pos),      // 没有硬件流控制
    UART_HWCONTROL_CTS         = (0x1UL << UARTx_CR2_CTSEN_Pos),      // CTS流控
    UART_HWCONTROL_RTS         = (0x2UL << UARTx_CR2_CTSEN_Pos),      // RTS流控
    UART_HWCONTROL_CTS_RTS     = (0x3UL << UARTx_CR2_CTSEN_Pos)       // CTS、RTS流控
} UART_HwControlTypeDef;

/* RS485驱动器输出信号极性 ----------------------------------------------------*/
typedef enum
{
    UART_DEPOLARITY_HIGH       = (0x0UL << UARTx_CR3_DEP_Pos),        // 驱动器输出高电平有效
    UART_DEPOLARITY_LOW        = (0x1UL << UARTx_CR3_DEP_Pos)         // 驱动器输出低电平有效
} UART_DEPolairyTypeDef;

/* RXD、TXD极性 --------------------------------------------------------------*/
typedef enum
{
    UART_POLTXRX_POSITIVE      = (0x0UL << UARTx_CR2_RXINV_Pos),      // RXD 正向输入, TXD 正向输出
    UART_POLRX_NEGATIVE        = (0x1UL << UARTx_CR2_RXINV_Pos),      // RXD 反向输入
    UART_POLTX_NEGATIVE        = (0x2UL << UARTx_CR2_RXINV_Pos),      // TXD 反向输出
    UART_POLRXTX_NEGATIVE      = (0x3UL << UARTx_CR2_RXINV_Pos)       // RXD 反向输入, TXD 反向输出
} UART_PolarityTypeDef;

/* UART TXD、RXD管脚交换 -----------------------------------------------------*/
typedef enum
{
    UART_SWAP_DISABLE          = (0x0UL << UARTx_CR2_SWAP_Pos),       // RXD、TXD管脚保持默认不交换
    UART_SWAP_ENABLE           = (0x1UL << UARTx_CR2_SWAP_Pos)        // RXD、TXD管脚进行交换
} UART_SwapEnTypeDef;

/* 从机地址识别使能 ----------------------------------------------------------*/
typedef enum
{
    UART_SLAVEADDR_DISABLE     = (0x0UL << UARTx_CR2_ADDREN_Pos),     // 禁止识别从机地址
    UART_SLAVEADDR_ENABLE      = (0x1UL << UARTx_CR2_ADDREN_Pos)      // 使能识别从机地址
} UART_SlaveAddrEnTypeDef;

/* LIN模式接收间隔段的长度阈值 -----------------------------------------------*/
typedef enum
{
    LIN_BRKLEN_10BIT           = (0x0UL << UARTx_CR3_LINBRK_Pos),
    LIN_BRKLEN_11BIT           = (0x1UL << UARTx_CR3_LINBRK_Pos)
} LIN_BrkLenTypeDef;

/* UART定时器工作模式 --------------------------------------------------------*/
typedef enum
{
    UART_TIMMODE_STOP          = (0x0UL << UARTx_CR2_TIMCR_Pos),      // 停止定时器
    UART_TIMMODE_WAITTIMEOUT   = (0x2UL << UARTx_CR2_TIMCR_Pos),      // 等待超时检测模式
    UART_TIMMODE_RXIDLE        = (0x3UL << UARTx_CR2_TIMCR_Pos),      // 接收空闲检测模式
    UART_TIMMODE_AUTOBAUD1     = (0x5UL << UARTx_CR2_TIMCR_Pos),      // 自动波特率检测模式1
    UART_TIMMODE_AUTOBAUD2     = (0x6UL << UARTx_CR2_TIMCR_Pos),      // 自动波特率检测模式2
    UART_TIMMODE_NORMAL        = (0x7UL << UARTx_CR2_TIMCR_Pos)       // 通用定时模式
} UART_TimModeTypeDef;

/* UART接收完成方式 ----------------------------------------------------------*/
typedef enum
{
    UART_RXDONE_FIXLEN         = 0,                                   // 接收固定长度数据
    UART_RXDONE_EOP            = (UARTx_ISR_RXMATCH_Msk),             // 接收到指定字符结尾
    UART_RXDONE_IDLE           = (UARTx_ISR_RXIDLE_Msk)               // 接收到RX空闲(驱动库配置，用户无需配置)
} UART_RxDoneFunTypeDef;

/* UART初始化结构体 ----------------------------------------------------------*/
typedef struct
{
    uint16_t                     SlaveAddr;                           // 从机地址，注意0xFF为广播地址
    uint16_t                     SlaveAddrMask;                       // 从机地址的掩码

    uint32_t                     PclkFreq;                            // PCLK的频率，以Hz为单位
    uint32_t                     BaudRate;                            // 波特率配置

    UART_WorkModeTypeDef         WorkMode;                            // 工作模式
    UART_ClockSourceTypeDef      ClockSource;                         // 传输时钟
    UART_ParityModeTypeDef       ParityMode;                          // 校验位控制
    UART_StopBitTypeDef          StopBits;                            // 停止位

    UART_RxdStartTypeDef         RxdStart;                            // RXD启动接收方式
    UART_HwControlTypeDef        HwControl;                           // 流控
    UART_SingleWireEnTypeDef     SingleWireEn;                        // 单线功能控制
    UART_PolarityTypeDef         Polarity;                            // RXD、TXD极性
    UART_SwapEnTypeDef           SwapEn;                              // RXD、TXD管脚交换控制
    UART_FirstBitTypeDef         FirstBit;                            // 数据帧高低位顺序

    UART_SlaveAddrEnTypeDef      SlaveAddrEn;                         // 从机地址识别控制
} UART_InitTypeDef;

/* ---------------------------------------------------------------------------*/
typedef struct __UART_HandleTypeDef
{
    UART_TypeDef                           *Instance;                 // UART 实体
    UART_InitTypeDef                       Init;                      // UART 初始化结构体
    UART_DataWidthTypeDef                  DataWidth;                 // 数据域长度

    UART_RxDoneFunTypeDef                  RxDoneFun;                 // UART 接收完成方式：接收固定长度数据 / 接收到指定字符结尾 / 接收到RX空闲(驱动库配置，用户无需配置)
    uint16_t                               RxEopChar;                 // UART 当接收完成方式为"接收到指定字符结尾"时 的结束字符

    uint8_t                                *pTxBuffPtr;               // UART 待发送数据的指针
    __IO uint32_t                          TxXferCount;               // UART 当前剩余待发送的数据帧数
    uint32_t                               TxXferSize;                // UART 待发送数据帧数

    uint8_t                                *pRxBuffPtr;               // UART 待接收数据的指针
    __IO uint32_t                          RxXferCount;               // UART 当前剩余待接收的数据帧数
    uint32_t                               RxXferSize;                // UART 待接收数据帧数

    uint32_t                               Flags;                     // UART ISR Flags
    __IO HAL_StatusTypeDef                 RxState;                   // UART 当前接收状态
    __IO HAL_StatusTypeDef                 TxState;                   // UART 当前发送状态
    __IO UART_ErrorCodeTypeDef             ErrorCode;                 // UART 错误码
    
    void (*RxDone_Func) (struct __UART_HandleTypeDef *hUart);         // 不定长数据接收功能函数指针
    void (*RxISR)       (struct __UART_HandleTypeDef *hUart);         // UART 接收中断函数指针
    void (*TxISR)       (struct __UART_HandleTypeDef *hUart);         // UART 发送中断函数指针
} UART_HandleTypeDef;


/******************************************************************************/
/* Global pre-processor symbols/macros ('#define')                            */
/******************************************************************************/
/* ---------------------------------------------------------------------------*/
#define UART_TIMCR_STOP                 (0x0UL << UARTx_CR2_TIMCR_Pos)
#define UART_TIMCR_OVERTIME             (0x2UL << UARTx_CR2_TIMCR_Pos)
#define UART_TIMCR_RXIDLE               (0x3UL << UARTx_CR2_TIMCR_Pos)
#define UART_TIMCR_AUTOBAUD1            (0x5UL << UARTx_CR2_TIMCR_Pos)
#define UART_TIMCR_AUTOBAUD2            (0x6UL << UARTx_CR2_TIMCR_Pos)
#define UART_TIMCR_NORMAL               (0x7UL << UARTx_CR2_TIMCR_Pos)

/* IER -----------------------------------------------------------------------*/
#define UART_IT_SOURCE_RXMATCH          (UARTx_IER_RXMATCH_Msk)
#define UART_IT_SOURCE_ORE              (UARTx_IER_ORE_Msk)
#define UART_IT_SOURCE_NE               (UARTx_IER_NE_Msk)
#define UART_IT_SOURCE_PE               (UARTx_IER_PE_Msk)
#define UART_IT_SOURCE_FE               (UARTx_IER_FE_Msk)
#define UART_IT_SOURCE_CTS              (UARTx_IER_CTS_Msk)
#define UART_IT_SOURCE_TIMOV            (UARTx_IER_TIMOV_Msk)
#define UART_IT_SOURCE_BAUD             (UARTx_IER_BAUD_Msk)
#define UART_IT_SOURCE_RXBRK            (UARTx_IER_RXBRK_Msk)
#define UART_IT_SOURCE_RXIDLE           (UARTx_IER_RXIDLE_Msk)
#define UART_IT_SOURCE_RC               (UARTx_IER_RC_Msk)
#define UART_IT_SOURCE_TC               (UARTx_IER_TC_Msk)
#define UART_IT_SOURCE_TXE              (UARTx_IER_TXE_Msk)
#define UART_IT_SOURCE_ERROR            (UART_IT_SOURCE_PE | UART_IT_SOURCE_FE | UART_IT_SOURCE_ORE | UART_IT_SOURCE_NE)
#define UART_IT_SOURCE_ALL              (0x1FFFUL)

/* ISR -----------------------------------------------------------------------*/
#define UART_IT_FLAG_CTSLV              (UARTx_ISR_CTSLV_Msk)
#define UART_IT_FLAG_TXBUSY             (UARTx_ISR_TXBUSY_Msk)
#define UART_IT_FLAG_SLVMATCH           (UARTx_ISR_SLVMATCH_Msk)
#define UART_IT_FLAG_RXMATCH            (UARTx_ISR_RXMATCH_Msk)
#define UART_IT_FLAG_ORE                (UARTx_ISR_ORE_Msk)
#define UART_IT_FLAG_NE                 (UARTx_ISR_NE_Msk)
#define UART_IT_FLAG_PE                 (UARTx_ISR_PE_Msk)
#define UART_IT_FLAG_FE                 (UARTx_ISR_FE_Msk)
#define UART_IT_FLAG_CTS                (UARTx_ISR_CTS_Msk)
#define UART_IT_FLAG_TIMOV              (UARTx_ISR_TIMOV_Msk)
#define UART_IT_FLAG_BAUD               (UARTx_ISR_BAUD_Msk)
#define UART_IT_FLAG_RXBRK              (UARTx_ISR_RXBRK_Msk)
#define UART_IT_FLAG_RXIDLE             (UARTx_ISR_RXIDLE_Msk)
#define UART_IT_FLAG_RC                 (UARTx_ISR_RC_Msk)
#define UART_IT_FLAG_TC                 (UARTx_ISR_TC_Msk)
#define UART_IT_FLAG_TXE                (UARTx_ISR_TXE_Msk)
#define UART_IT_FLAG_ERROR              (UART_IT_FLAG_PE | UART_IT_FLAG_FE | UART_IT_FLAG_ORE | UART_IT_FLAG_NE)
#define UART_IT_FLAG_ALL                (0xFFFFUL)


/******************************************************************************/
/* Global macro function                                                      */
/******************************************************************************/
/**
  * @brief  获取 UART 中断触发源
  * @param  HANDLE   : hUart句柄指针，指向包含UART配置、通信参数的结构体
  * @param  ITSOURCE : UART 中断触发源
  *                    @arg UART_IT_SOURCE_RXMATCH
  *                    @arg UART_IT_SOURCE_ORE
  *                    @arg UART_IT_SOURCE_NE
  *                    @arg UART_IT_SOURCE_PE
  *                    @arg UART_IT_SOURCE_FE
  *                    @arg UART_IT_SOURCE_CTS
  *                    @arg UART_IT_SOURCE_TIMOV
  *                    @arg UART_IT_SOURCE_BAUD
  *                    @arg UART_IT_SOURCE_RXBRK
  *                    @arg UART_IT_SOURCE_RXIDLE
  *                    @arg UART_IT_SOURCE_RC
  *                    @arg UART_IT_SOURCE_TC
  *                    @arg UART_IT_SOURCE_TXE
  *                    @arg UART_IT_SOURCE_ALL
  * @retval
  */
#define HAL_UART_GET_IT_SOURCE(HANDLE, ITSOURCE)  ((HANDLE)->Instance->IER & (ITSOURCE))

/**
  * @brief  使能 UART 中断触发源
  * @param  HANDLE   : hUart句柄指针，指向包含UART配置、通信参数的结构体
  * @param  ITSOURCE : UART 中断触发源
  *                    @arg UART_IT_SOURCE_RXMATCH
  *                    @arg UART_IT_SOURCE_ORE
  *                    @arg UART_IT_SOURCE_NE
  *                    @arg UART_IT_SOURCE_PE
  *                    @arg UART_IT_SOURCE_FE
  *                    @arg UART_IT_SOURCE_CTS
  *                    @arg UART_IT_SOURCE_TIMOV
  *                    @arg UART_IT_SOURCE_BAUD
  *                    @arg UART_IT_SOURCE_RXBRK
  *                    @arg UART_IT_SOURCE_RXIDLE
  *                    @arg UART_IT_SOURCE_RC
  *                    @arg UART_IT_SOURCE_TC
  *                    @arg UART_IT_SOURCE_TXE
  *                    @arg UART_IT_SOURCE_ALL
  * @retval
  */
#define HAL_UART_ENABLE_IT(HANDLE, ITSOURCE)  ((HANDLE)->Instance->IER |= (ITSOURCE))

/**
  * @brief  关闭 UART 中断触发源
  * @param  HANDLE   : hUart句柄指针，指向包含UART配置、通信参数的结构体
  * @param  ITSOURCE : UART 中断触发源
  *                    @arg UART_IT_SOURCE_RXMATCH
  *                    @arg UART_IT_SOURCE_ORE
  *                    @arg UART_IT_SOURCE_NE
  *                    @arg UART_IT_SOURCE_PE
  *                    @arg UART_IT_SOURCE_FE
  *                    @arg UART_IT_SOURCE_CTS
  *                    @arg UART_IT_SOURCE_TIMOV
  *                    @arg UART_IT_SOURCE_BAUD
  *                    @arg UART_IT_SOURCE_RXBRK
  *                    @arg UART_IT_SOURCE_RXIDLE
  *                    @arg UART_IT_SOURCE_RC
  *                    @arg UART_IT_SOURCE_TC
  *                    @arg UART_IT_SOURCE_TXE
  *                    @arg UART_IT_SOURCE_ALL
  * @retval
  */
#define HAL_UART_DISABLE_IT(HANDLE, ITSOURCE)  ((HANDLE)->Instance->IER &= ~((uint32_t)(ITSOURCE)))

/**
  * @brief  获取 UART 中断触发标志
  * @param  HANDLE   : hUart句柄指针，指向包含UART配置、通信参数的结构体
  * @param  FLAG     : UART 中断触发标志
  *                    @arg UART_IT_FLAG_CTSLV
  *                    @arg UART_IT_FLAG_TXBUSY
  *                    @arg UART_IT_FLAG_SLVMATCH
  *                    @arg UART_IT_FLAG_RXMATCH
  *                    @arg UART_IT_FLAG_ORE
  *                    @arg UART_IT_FLAG_NE
  *                    @arg UART_IT_FLAG_PE
  *                    @arg UART_IT_FLAG_FE
  *                    @arg UART_IT_FLAG_CTS
  *                    @arg UART_IT_FLAG_TIMOV
  *                    @arg UART_IT_FLAG_BAUD
  *                    @arg UART_IT_FLAG_RXBRK
  *                    @arg UART_IT_FLAG_RXIDLE
  *                    @arg UART_IT_FLAG_RC
  *                    @arg UART_IT_FLAG_TC
  *                    @arg UART_IT_FLAG_TXE
  *                    @arg UART_IT_FLAG_ALL
  * @retval
  */
#define HAL_UART_GET_FLAG(HANDLE, FLAG)  ((HANDLE)->Instance->ISR & (FLAG))

/**
  * @brief  清除 UART 中断触发标志
  * @param  HANDLE   : hUart句柄指针，指向包含UART配置、通信参数的结构体
  * @param  FLAG     : UART 中断触发标志
  *                    @arg UART_IT_FLAG_RXMATCH
  *                    @arg UART_IT_FLAG_ORE
  *                    @arg UART_IT_FLAG_NE
  *                    @arg UART_IT_FLAG_PE
  *                    @arg UART_IT_FLAG_FE
  *                    @arg UART_IT_FLAG_CTS
  *                    @arg UART_IT_FLAG_TIMOV
  *                    @arg UART_IT_FLAG_BAUD
  *                    @arg UART_IT_FLAG_RXBRK
  *                    @arg UART_IT_FLAG_RXIDLE
  *                    @arg UART_IT_FLAG_RC
  *                    @arg UART_IT_FLAG_TC
  *                    @arg UART_IT_FLAG_TXE
  *                    @arg UART_IT_FLAG_ALL
  * @retval
  */
#define HAL_UART_CLR_FLAG(HANDLE, FLAG) ((HANDLE)->Instance->ICR = ~((uint32_t)(FLAG)))

/**
  * @brief  使能 UARTx 回环功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_LOOP_ENABLE(UARTx)     (REGBITS_SET(UARTx->CR2, UARTx_CR2_LOOP_Msk))

/**
  * @brief  禁止 UARTx 回环功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_LOOP_DISABLE(UARTx)    (REGBITS_CLR(UARTx->CR2, UARTx_CR2_LOOP_Msk))

/**
  * @brief  使能 UART 发送完成触发 ADC 功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_ADCTX_ENABLE(UARTx)    (REGBITS_SET(UARTx->CR2, UARTx_CR2_ADCTX_Msk))

/**
  * @brief  禁止 UART 发送完成触发 ADC 功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_ADCTX_DISABLE(UARTx)   (REGBITS_CLR(UARTx->CR2, UARTx_CR2_ADCTX_Msk))

/**
  * @brief  使能 UART 接收完成触发 ADC 功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_ADCRX_ENABLE(UARTx)    (REGBITS_SET(UARTx->CR2, UARTx_CR2_ADCRX_Msk))

/**
  * @brief  禁止 UART 接收完成触发 ADC 功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval
  */
#define HAL_UART_ADCRX_DISABLE(UARTx)  (REGBITS_CLR(UARTx->CR2, UARTx_CR2_ADCRX_Msk))

/**
  * @brief  使能 UART RS485 驱动器使能功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval none
  * @note   CR3.DEM优先级高于CR2.RTSEN
  */
#define HAL_UART_DEM_ENABLE(UARTx)  (REGBITS_SET(UARTx->CR3, UARTx_CR3_DEM_Msk))

/**
  * @brief  禁止 UART RS485 驱动器使能功能
  * @param  UARTx: UART名称
  *                @arg SYM_UART1
  *                @arg SYM_UART2
  * @retval none
  * @note   CR3.DEM优先级高于CR2.RTSEN
  */
#define HAL_UART_DEM_DISABLE(UARTx)  (REGBITS_CLR(UARTx->CR3, UARTx_CR3_DEM_Msk))

/**
  * @brief  调用HAL_UART_Transmit供同步模式使用
  * @param  参考函数 HAL_UART_Transmit()
  * @retval 参考函数 HAL_UART_Transmit()
  */
#define HAL_UART_Transmit_Sync       HAL_UART_Transmit

/******************************************************************************/
/* Exported variables ('extern', definition in C source)                      */
/******************************************************************************/


/******************************************************************************/
/* Global function prototypes ('extern', definition in C source)              */
/******************************************************************************/
void                 HAL_UART_AutoBaud(UART_TypeDef *UARTx, GTIM_TypeDef *GTIMx);
void                 HAL_UART_AutoBaud1(UART_TypeDef *UARTx);
void                 HAL_UART_AutoBaud2(UART_TypeDef *UARTx);

void                 HAL_UART_RXD_Enable(UART_TypeDef *UARTx);
void                 HAL_UART_RXD_Disable(UART_TypeDef *UARTx);
void                 HAL_UART_TXD_Enable(UART_TypeDef *UARTx);
void                 HAL_UART_TXD_Disable(UART_TypeDef *UARTx);

void                 HAL_UART_SendHalfWord(UART_TypeDef *UARTx, uint16_t ch);
uint16_t             HAL_UART_RecvHalfWord(UART_TypeDef *UARTx);
void                 HAL_UART_SendByte(UART_TypeDef *UARTx, uint8_t ch);
uint8_t              HAL_UART_RecvByte(UART_TypeDef *UARTx);

HAL_StatusTypeDef    HAL_UART_Init(UART_HandleTypeDef *hUart);
HAL_StatusTypeDef    HAL_UART_LpInit(UART_HandleTypeDef *hUart);
HAL_StatusTypeDef    HAL_UART_DeInit(UART_HandleTypeDef *hUart);

HAL_StatusTypeDef    HAL_UART_Receive_Sync(UART_HandleTypeDef *hUart, uint8_t *pData, uint32_t Size, uint32_t TimeOut);
HAL_StatusTypeDef    HAL_UART_Transmit(UART_HandleTypeDef *hUart, uint8_t *pData, uint32_t Size, uint32_t TimeOut);
HAL_StatusTypeDef    HAL_UART_Receive(UART_HandleTypeDef *hUart, uint8_t *pData, uint32_t Size, uint32_t TimeOut);

HAL_StatusTypeDef    HAL_UART_Transmit_IT(UART_HandleTypeDef *hUart, uint8_t *pData, uint32_t Size);
HAL_StatusTypeDef    HAL_UART_Transmit_IT_IsComplete(UART_HandleTypeDef *hUart);

HAL_StatusTypeDef    HAL_UART_Receive_IT(UART_HandleTypeDef *hUart, uint8_t *pData, uint32_t Size);
HAL_StatusTypeDef    HAL_UART_Receive_IT_IsComplete(UART_HandleTypeDef *hUart);

void                 HAL_UART_IRQHandler(UART_HandleTypeDef *hUart);

void                 HAL_LIN_Enable(UART_TypeDef *UARTx, LIN_BrkLenTypeDef RxBreakLen);
void                 HAL_LIN_SendBreak(UART_TypeDef *UARTx, uint16_t TxBreakLen);

#ifdef __cplusplus
}
#endif

#endif /* __SYM32L010_HAL_UART_H */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
